package cn.agiledata.bank.transaction.service;

import java.math.BigDecimal;
import java.util.List;
import java.util.Map;

import cn.agiledata.bank.audit.exception.AuditException;
import cn.agiledata.bank.hibernateBean.Account;
import cn.agiledata.bank.hibernateBean.Operator;
import cn.agiledata.bank.hibernateBean.SubAccount;
import cn.agiledata.bank.hibernateBean.Transaction;
import cn.agiledata.bank.transaction.exception.TransactionException;
import cn.agiledata.bank.transaction.logic.BatchImportFile;
import cn.agiledata.bank.transaction.logic.BatchPeerAccount;

/**
 * 交易服务
 * 
 * @author maxianbo
 * 
 */
public interface TransactionService {

    /**
     * 计算指定付款子账户在进行指定交易类型的交易时，在交易金额为指定交易的情况下，付款方需要缴纳的手续费
     * 
     * @param debitSubAccount
     *            付款子账户
     * @param actionType
     *            交易类型
     * @param amount
     *            交易金额
     * @return 付款方手续费
     */
    public BigDecimal getDebitFee(SubAccount debitSubAccount,
            String actionType, BigDecimal amount);

    /**
     * 计算指定收款子账户在进行指定交易类型的交易时，在交易金额为指定交易的情况下，收款方需要缴纳的手续费
     * 
     * @param creditSubAccount
     *            收款子账户
     * @param actionType
     *            交易类型
     * @param amount
     *            交易金额
     * @return 收款方手续费
     */
    public BigDecimal getCreditFee(SubAccount creditSubAccount,
            String actionType, BigDecimal amount);

    /**
     * 获取指定账户的指定交易类型的收费方式描述
     * 
     * @param account
     *            账户
     * @param actionType
     *            交易类型
     * @return 收费方式描述
     */
    public String getFeeModeDescription(Account account, String actionType);

    /**
     * 校验指定付款方是否具有向指定收款方进行指定交易的权限
     * 
     * @param debit
     *            付款方帐户
     * @param credit
     *            收款方帐户
     * @param creditName
     *            收款方名称
     * @param actionType
     *            交易类型
     * @exception 当指定付款方不具有向指定收款方进行指定交易的权限时
     */
    public void validateTransactable(Account debit, Account credit,
            String creditName, String actionType) throws TransactionException;

    /**
     * 根据交易编号获取交易对象
     * 
     * @param transId
     *            交易编号
     * @return 交易对象
     */
    public Transaction getTransactionByTransId(String transId);

    /**
     * 判断指定交易是否已被确认。已确认的交易资金已经流动，不能再次进行使得资金从付款方流向收款方的操作
     * 
     * @param trans
     *            交易
     * @return true if 指定交易已被确认, otherwise false
     */
    public boolean isAffirmedTransaction(Transaction trans);

    /**
     * 创建并保存批量支付交易
     * 
     * @param batchPeerAccount
     *            批量支付交易对方设置
     * @param debit
     *            付款方子账户
     * @param purpose
     *            目的
     * @param remark
     *            备注
     * @param operator
     *            操作员
     * @return 批次号
     * @throws TransactionException
     *             如果创建或保存过程中出现交易业务异常
     * @throws AuditException
     *             如果创建或保存过程中出现审核异常
     */
    public String saveBatchTransactions(BatchPeerAccount batchPeerAccount,
            SubAccount debit, String purpose, String remark, Operator operator)
            throws TransactionException, AuditException;
    
    /**
     * 创建并保存批量卡充值交易
     * 
     * @param batchPeerAccount
     *            批量支付交易对方设置
     * @param debit
     *            付款方子账户
     * @param purpose
     *            目的
     * @param remark
     *            备注
     * @param operator
     *            操作员
     * @return 批次号
     * @throws TransactionException
     *             如果创建或保存过程中出现交易业务异常
     * @throws AuditException
     *             如果创建或保存过程中出现审核异常
     */
    public String saveBatchInpuor(List inpuorCardList,
            SubAccount debit, String purpose, String remark, Operator operator)
            throws TransactionException, AuditException;

    /**
     * 根据批量导入文件的输入流创建批量支付交易对方设置
     * 
     * @param file
     *            批量导入文件的输入流
     * @return 批量支付交易对方设置
     * @throws TransactionException
     *             如果创建过程出现错误
     */
    public BatchPeerAccount createBatchPeerAccountByBatchImportFile(
            BatchImportFile file) throws TransactionException;

    /**
     * 校验指定付款方是否具有进行指定批量交易的权限
     * 
     * @param debit
     *            付款方
     * @param batchPeerAccount
     *            批量交易数据
     * @throws TransactionException
     *             当指定付款方不具有进行指定批量交易的权限时
     */
    public void validateBatchTransactable(Account debit,
            BatchPeerAccount batchPeerAccount) throws TransactionException;

    /**
     * 从批量导入文件中导入所有交易
     */
    public void importAllTransFromBatchImportFiles();
    
    /**
     * 根据原交易ID创建退款交易
     * 
     * @param ids
     * @param amounts
     * @param account
     * @param operator
     * @return int 退款交易条数
     * @throws AuditException 
     * @throws Exception 
     */
    public int createReturnApply(Long[] ids, Map amounts, Account account,
			Operator operator) throws TransactionException, AuditException, Exception;
    /**
     * 验证退款申请数据是否合法(退款接口调用)
     * @param account
     * @param returnMoneyList
     * @return
     */
    public List getValReturnMoney(Account account, List returnMoneyList);
}